#include<unistd.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<string.h>
#include<stdio.h>
#include<errno.h>
#include<sys/wait.h>
#include<signal.h>
#include<time.h>
#include<sys/select.h>
#include<math.h>
#include<netdb.h>
#include<sys/epoll.h>
#include<sys/un.h>

#define	LISTENQ		1024	/* 2nd argument to listen() */

/* Miscellaneous constants */
#define	MAXLINE		4096	/* max text line length */
#define	BUFFSIZE	8192	/* buffer size for reads and writes */

/* Define some port number that can be used for our examples */
#define	SERV_PORT		 9877			/* TCP and UDP */
#define	SERV_PORT_STR	"9877"			/* TCP and UDP */

#define min( a, b ) ( ( a ) < ( b ) ? ( a ) : ( b ) )
#define max( a, b ) ( ( a ) > ( b ) ? ( a ) : ( b ) )

//typedef	void	Sigfunc(int);	/* for signal handlers */

int Socket( int family, int type, int protocol );

int Bind( int family, const struct sockaddr *myaddr, socklen_t addrlen );
int Connect( int sockfd, const struct sockaddr *servaddr, socklen_t addrlen );
int Listen( int sockfd, int backlog );
int Accept( int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen );
size_t Recvfrom( int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen);
void Sendto( int sockfd, const void *buff, size_t nbytes, int flags, const struct sockaddr *to, socklen_t addrlen);

pid_t Fork( void );

//Sigfunc * Signal(int signo, Sigfunc *func);

ssize_t readn( int fd, void *vptr, size_t n );
ssize_t writen( int fd, const void *vptr, size_t n );
ssize_t readline( int fd, void *vptr, size_t maxlen );

//void err_doit(int, int, const char *, va_list);
void err_ret(const char *fmt, ...);
void err_sys(const char *fmt, ...);
void err_dump(const char *fmt, ...);
void err_msg(const char *fmt, ...);
void err_quit(const char *fmt, ...);
//void err_doit(int errnoflag, int level, const char *fmt, va_list ap);

void Fclose(FILE *fp);
FILE * Fdopen(int fd, const char *type);
char * Fgets(char *ptr, int n, FILE *stream);
FILE * Fopen(const char *filename, const char *mode);
void Fputs(const char *ptr, FILE *stream);

size_t Read( int sockfd, char *buff, size_t len );
size_t Write( int sockfd, char *buff, size_t len ); 

void str_cli(FILE *fp, int sockfd);
void str_echo(int sockfd);
void dg_cli( FILE *fp, int sockfd, struct sockaddr * pservaddr, socklen_t servlen );
void dg_cliout( FILE *fp, int sockfd, struct sockaddr * pservaddr, socklen_t servlen );

int Shutdown( int sockfd, int howto );

int Select( int maxfd1, fd_set *readset, fd_set *writeset, fd_set *exceptset, struct timeval *timeout );

/* 
POSIX标准定义的头文件
<dirent.h>          目录项
<fcntl.h>           文件控制
<fnmatch.h>         文件名匹配类型
<glob.h>            路径名模式匹配类型
<grp.h>             组文件
<netdb.h>           网络数据库操作
<pwd.h>             口令文件
<regex.h>           正则表达式
<tar.h>             TAR归档值
<termios.h>         终端I/O
<unistd.h>          符号常量
<utime.h>           文件时间
<wordexp.h>         字符扩展类型
<arpa/inet.h>       INTERNET定义
<net/if.h>          套接字本地接口
<netinet/in.h>      INTERNET地址族
<netinet/tcp.h>     传输控制协议定义
<sys/mman.h>        内存管理声明
<sys/select.h>      Select函数
<sys/socket.h>      套接字借口
<sys/stat.h>        文件状态
<sys/times.h>       进程时间
<sys/types.h>       基本系统数据类型
<sys/un.h>          UNIX域套接字定义
<sys/utsname.h>     系统名
<sys/wait.h>        进程控制

POSIX定义的XSI扩展头文件
<cpio.h>            cpio归档值    
<dlfcn.h>           动态链接
<fmtmsg.h>          消息显示结构
ftw.h>              文件树漫游
<iconv.h>           代码集转换使用程序
<langinfo.h>        语言信息常量
<libgen.h>          模式匹配函数定义
<monetary.h>        货币类型
<ndbm.h>            数据库操作
<nl_types.h>        消息类别
<poll.h>            轮询函数
<search.h>          搜索表
<strings.h>         字符串操作
<syslog.h>          系统出错日志记录
<ucontext.h>        用户上下文
<ulimit.h>          用户限制
<utmpx.h>           用户帐户数据库    
<sys/ipc.h>         IPC(命名管道)
<sys/msg.h>         消息队列
<sys/resource.h>    资源操作
<sys/sem.h>         信号量
<sys/shm.h>         共享存储
<sys/statvfs.h>     文件系统信息
<sys/time.h>        时间类型
<sys/timeb.h>       附加的日期和时间定义
<sys/uio.h>         矢量I/O操作

POSIX定义的可选头文件
<aio.h>             异步I/O
<mqueue.h>          消息队列
<pthread.h>         线程
<sched.h>           执行调度
<semaphore.h>       信号量
<spawn.h>           实时spawn接口
<stropts.h>         XSI STREAMS接口
<trace.h>           事件跟踪
*/
